/*
 * SoapUI, Copyright (C) 2004-2017 SmartBear Software
 *
 * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent 
 * versions of the EUPL (the "Licence"); 
 * You may not use this work except in compliance with the Licence. 
 * You may obtain a copy of the Licence at: 
 * 
 * http://ec.europa.eu/idabc/eupl 
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the Licence is 
 * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
 * express or implied. See the Licence for the specific language governing permissions and limitations 
 * under the Licence. 
 */

package com.eviware.soapui.security.ui;

import com.eviware.soapui.security.scan.XmlBombSecurityScan;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.components.SimpleForm;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;

@SuppressWarnings("serial")
public class XmlBombSecurityScanConfigPanel extends JPanel {
    private static final String ATTACHMENT_PREFIX_FIELD = "Attachment Prefix Field";
    private static final String ENABLE_ATTACHMENT_FIELD = "Send bomb as attachment";

    private List<String> xmlBombList;
    private JTextArea attachementArea;

    private int xmlBombPosition = -1;
    private PreviousAttachement previous;
    private NextAttachement next;
    private JLabel current;
    private JLabel max;
    protected int internalPosition;
    protected int externalPosition;
    private SimpleForm form;
    private XmlBombSecurityScan xmlChk;

    public XmlBombSecurityScanConfigPanel(XmlBombSecurityScan xmlCheck) {
        super(new BorderLayout());

        this.xmlChk = xmlCheck;
        this.xmlBombList = xmlCheck.getXmlBombList();
        form = new SimpleForm();
        form.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 3));
        form.addSpace(5);

        form.addComponent(new JLabel("Xml Bomb Attacments"));

        JCheckBox attachXml = form.appendCheckBox(ENABLE_ATTACHMENT_FIELD, null, xmlCheck.isAttachXmlBomb());
        attachXml.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent arg0) {
                form.getComponent(ATTACHMENT_PREFIX_FIELD).setEnabled(
                        ((JCheckBox) form.getComponent(ENABLE_ATTACHMENT_FIELD)).isSelected());
                xmlChk.setAttachXmlBomb(((JCheckBox) form.getComponent(ENABLE_ATTACHMENT_FIELD)).isSelected());
            }
        });

        JTextField attachmentPrefixField = form.appendTextField(ATTACHMENT_PREFIX_FIELD, "Attachment Prefix Field");
        attachmentPrefixField.setMaximumSize(new Dimension(80, 10));
        attachmentPrefixField.setColumns(20);
        attachmentPrefixField.setText(xmlCheck.getAttachmentPrefix());
        attachmentPrefixField.setEnabled(xmlCheck.isAttachXmlBomb());
        attachmentPrefixField.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyReleased(KeyEvent arg0) {
                xmlChk.setAttachmentPrefix(((JTextField) form.getComponent(ATTACHMENT_PREFIX_FIELD)).getText());
            }

            @Override
            public void keyPressed(KeyEvent arg0) {
                // TODO Auto-generated method stub

            }
        });
        JXToolBar toolbar = UISupport.createSmallToolbar();
        toolbar.add(previous = new PreviousAttachement());
        previous.setEnabled(false);
        toolbar.add(next = new NextAttachement());
        toolbar.add(new AddXmlAttachement());
        toolbar.add(new RemoveAttachement());
        toolbar.add(new SaveAttachement());
        toolbar.add(current = new JLabel("  current:0"));
        toolbar.add(max = new JLabel("  max:" + xmlBombList.size()));
        form.append(toolbar);
        attachementArea = new JTextArea(10, 15);
        xmlBombPosition = 0;
        if (xmlBombList.size() > 0) {
            attachementArea.setText(xmlBombList.get(xmlBombPosition));
            if (xmlBombList.size() == 1) {
                next.setEnabled(false);
            }
        } else {
            next.setEnabled(false);
        }
        form.append(new JScrollPane(attachementArea));

        form.addSpace(5);

        add(form.getPanel());
    }

    private class PreviousAttachement extends AbstractAction {

        public PreviousAttachement() {
            putValue(Action.SMALL_ICON, UISupport.createImageIcon("/left_arrow.gif"));
            putValue(Action.SHORT_DESCRIPTION, "Previous Xml Bomb");
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            xmlBombPosition--;
            next.setEnabled(true);
            attachementArea.setText(xmlBombList.get(xmlBombPosition));
            if (xmlBombPosition == 0) {
                setEnabled(false);
            }
            current.setText("  current:" + xmlBombPosition);
        }

    }

    private class NextAttachement extends AbstractAction {

        public NextAttachement() {
            putValue(Action.SMALL_ICON, UISupport.createImageIcon("/right_arrow.gif"));
            putValue(Action.SHORT_DESCRIPTION, "Next Xml Bomb");
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            xmlBombPosition++;
            previous.setEnabled(true);
            attachementArea.setText(xmlBombList.get(xmlBombPosition));
            if (xmlBombPosition == xmlBombList.size() - 1) {
                setEnabled(false);
            }
            current.setText("  current:" + xmlBombPosition);
        }

    }

    private class SaveAttachement extends AbstractAction {

        public SaveAttachement() {
            putValue(Action.SMALL_ICON, UISupport.createImageIcon("/save_all.gif"));
            putValue(Action.SHORT_DESCRIPTION, "Save Xml Bomb");
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            xmlBombList.set(xmlBombPosition, attachementArea.getText());
        }

    }

    private class AddXmlAttachement extends AbstractAction {

        public AddXmlAttachement() {
            putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add.png"));
            putValue(Action.SHORT_DESCRIPTION, "Add new Xml Bomb");
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            xmlBombList.add("");
            attachementArea.setText("");
            max.setText("  max:" + xmlBombList.size());
            xmlBombPosition = xmlBombList.size() - 1;
            current.setText("  current:" + xmlBombPosition);
            next.setEnabled(false);
            if (xmlBombList.size() > 1) {
                previous.setEnabled(true);
            }
        }

    }

    private class RemoveAttachement extends AbstractAction {

        public RemoveAttachement() {
            putValue(Action.SMALL_ICON, UISupport.createImageIcon("/delete.png"));
            putValue(Action.SHORT_DESCRIPTION, "Remove current Xml Bomb");
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (!xmlBombList.isEmpty()) {

                xmlBombList.remove(xmlBombPosition);
                if (xmlBombPosition >= xmlBombList.size() && !xmlBombList.isEmpty()) {
                    xmlBombPosition = xmlBombList.size() - 1;
                } else {
                    if (xmlBombList.isEmpty()) {
                        xmlBombPosition = 0;
                        next.setEnabled(false);
                        previous.setEnabled(false);
                    }

                }
                if (xmlBombList.size() == 1) {
                    xmlBombPosition = 0;
                    next.setEnabled(false);
                    previous.setEnabled(false);
                }
                if (xmlBombList.size() - 1 == xmlBombPosition) {
                    next.setEnabled(false);
                }
                if (xmlBombList.isEmpty()) {
                    attachementArea.setText("");
                } else {
                    attachementArea.setText(xmlBombList.get(xmlBombPosition));
                }
                current.setText("  current:" + xmlBombPosition);
                max.setText("  max:" + xmlBombList.size());
            }
        }
    }

}
